package com.frame.ar.hander;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.frame.ar.hander.MessageXMLHander.Data;
import com.frame.ar.hander.MessageXMLHander.Message;
import com.frame.ar.util.MapUtil;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;



/**
 * 作用描述：企信消息配置文件
 * @author LRC
 * @createDate 2015年10月20日
 * @version v1.0 
 * @updateRecord 格式：时间，作者，修改说明
 **
 * 
 */
public class MessageHander {
	
	/**
	 * 功能描述：根据消息id，和传入参数获取消息实体
	 * @createDate 2015年10月20日 by LRC
	 * @param messageId
	 * @param base
	 * @return 
	 * @throws Exception 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public static String getMessage(String messageId,Map<String,Object> base) throws Exception{
		
		MessageXMLHander config = MessageXMLHander.getInstance();
		//实时解析
		config.parse();
		//获取消息模板对象
		Message message = config.getMessage(messageId);
		if(message==null)return null;
		//或消息表达式
		String express = new String(message.express);
		//初始化数据集合
		Map<String,Map<String,Object>> datas = new HashMap<String, Map<String,Object>>();
		datas.put("base", base);
		if(message.datas!=null){
			for(Data data : message.datas){
				if("db".equals(data.type)){
					fillDataBySQL(data.sql,data,datas);
				}else if("list".equals(data.type)){
					datas.put(data.id, data.data);
				}
			}
		}
		return fillMessage(express, datas);
	}
	
	/**
	 * 功能描述：通过sql填充数据
	 * @createDate 2015年10月21日 by LRC
	 * @param sql
	 * @param datas 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public static void fillDataBySQL(String sql,Data dataArg,Map<String,Map<String,Object>> datas){
		//判断sql的合法性
		if(sql==null || "".equals(sql.trim()))return;
		
		if(sql.indexOf("select")==-1)return;
		
		//解析查询参数
		List<String[]> argNames = parseTXT(sql);
		String SQL = getSQL(sql);
		List<Object> args = new ArrayList<Object>();
		for(String[] arg : argNames){
			String dataId = arg[0];
			String key = arg[1];
			Map<String,Object> data =datas.get(dataId);
			if(data!=null){
				args.add(data.get(key));
			}
		}
		//获取数据源
		String dbSource = dataArg.dbSource;
		
		//查询数据列表
		List<Record> rs = Db.use(dbSource).find(SQL, args.toArray(new Object[]{}));
		List<Map<String,Object>> _datas = MapUtil.getMapListFromRecord(rs);
		//填充数据
		if(_datas.size()>0){
			if(_datas.size()>=dataArg.rownum){
				datas.put(dataArg.id, _datas.get(dataArg.rownum-1));
			}else{
				datas.put(dataArg.id, _datas.get(_datas.size()-1));
			}
		}
		
	}
	
	/**
	 * 功能描述：解析sql获取查询参数名
	 * @createDate 2015年10月21日 by LRC
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public static List<String[]> parseTXT(String sql){
		Pattern pattern = Pattern.compile("\\[([^\\[]*)\\]");
		Matcher matcher = pattern.matcher(sql);
		List<String[]> arr = new ArrayList<String[]>();
		while(matcher.find()){
			String[] val;
			String txt = matcher.group(1);
			val = txt.split("\\.");
			arr.add(val);
		}
		return arr;
	}
	
	/**
	 * 功能描述：获取参数查询语句
	 * @createDate 2015年10月21日 by LRC
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public static String getSQL(String sql){
		Pattern pattern = Pattern.compile("\\[([^\\[]*)\\]");
		Matcher matcher = pattern.matcher(sql);
		String sb = new String(sql);
		while(matcher.find()){
			String txt = matcher.group(1);
			sb = sb.replaceAll("\\["+txt+"\\]", "\\?");
		}
		return sb;
	}
	
	/**
	 * 功能描述：填充数据对象
	 * @createDate 2015年10月21日 by LRC
	 * @param msg
	 * @param datas
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public static String fillMessage(String msg,Map<String,Map<String,Object>> datas){
		//解析查询参数
		List<String[]> argNames = parseTXT(msg);
		for(String[] arg : argNames){
			String dataId = arg[0];
			String key = arg[1];
			Map<String,Object> data =datas.get(dataId);
			msg = msg.replaceAll("\\["+dataId+"."+key+"\\]", data.get(key)+"");
		}
		return msg;
	}
	
	public static void main(String[] args) {
		String sql = "select CUSERNAME from USERS where U_NAME=[base.uname] and ii>[base.uname1]";
		List<String[]> arr = parseTXT(sql);
		for(String[] ar : arr){
			System.out.println(Arrays.toString(ar));
		}
		
		System.out.println(sql);
		System.out.println(getSQL(sql));
		System.out.println(sql.replaceAll("\\[base.uname\\]", "?"));
	}
}
